package com.kintreda.ieco_server.util;

import java.lang.reflect.Field;
import org.springframework.beans.BeanUtils;
/**
 *
 * 对象工具类
 *
 * @author huangzhongyao
 */
public class ObjectUtils<T> {

    /***
     *
     * 这是一个对象赋值的方法 将同一类型的两个对象 把"参数"对象的非空属性赋值给 原对象
     *
     * @param destination 原来的对象
     * @param origin       带有值的对象
     * @param <T> origin
     */
    public static <T> void mergeObject(T destination, T origin) {
        if (origin == null || destination == null)
            return;
        if (!origin.getClass().equals(destination.getClass()))
            return;

        Field[] fields = origin.getClass().getDeclaredFields();//origin 的属性数组
        for (int i = 0; i < fields.length; i++) {
            try {
                fields[i].setAccessible(true);//设置为true 可以访问实列的私有属性
                Object value = fields[i].get(origin);//得到 origin的第i个属性值
                if (null != value) {
                    fields[i].set(destination, value);//设置 destination 的第 i个属性值
                }
                fields[i].setAccessible(false);//关闭访问权限
            } catch (Exception e) {
            }
        }
    }


    /**
     * 将两个不同类型的对象赋值
     *
     * @param obj1 带有值得对象原对象
     * @param obj2 赋值之后得对象
     * 冒泡赋值
     * @param <T>
     * @throws IllegalArgumentException
     * @throws IllegalAccessException
     */
    public static <T> void assignment(T obj1, T obj2) throws IllegalArgumentException, IllegalAccessException {
       BeanUtils.copyProperties(obj1,obj2);
    }

    /**
     * 将两个对象(同类型)之间赋值
     * 将 destination的非空属性 set到origin的空属性
     *
     * @param origin
     * @param destination
     * @param <T>
     * @throws IllegalArgumentException
     */
    public static <T> void collect(T origin, T destination) throws IllegalArgumentException {
        //验证非空对象
        if (origin == null || destination == null)
            return;
        if (!origin.getClass().equals(destination.getClass()))
            return;




        //赋值
        Field[] fields = origin.getClass().getDeclaredFields();
        for (int i = 0; i < fields.length; i++) {
            try {
                fields[i].setAccessible(true);
                Object oriVal = fields[i].get(origin);
                if (oriVal == null  || oriVal.toString().equals("")){
                    Object value  = fields[i].get(destination);
                    if (value != null){
                        fields[i].set(origin, value);
                        Object oriVa2 = fields[i].get(origin);
                        System.out.println("设置后的当前字段值" + oriVa2.toString());
                    }
                }
                fields[i].setAccessible(false);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }


}




